﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using AgendaManager.AgendaService;

namespace AgendaManager
{
    public partial class frmPlanos : Form
    {
        Carpeta Carpeta { get; set; }
        List<Plano> Planos = new List<Plano>();

        public frmPlanos()
        {
            InitializeComponent();
        }

        private void frmPlanos_Load(object sender, EventArgs e)
        {
            //FillGvPlanos();
        }

        internal void SetValues(Obra obra, Carpeta carpeta)
        {
            try
            {
                Carpeta = carpeta;

                txObra.Text = obra.Nombre;
                txCarpeta.Text = Carpeta.Tipo;

                FillGvPlanos();
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        private void btnNuevoPlano_Click(object sender, EventArgs e)
        {
            List<Plano> planos = new List<Plano>();

            this.openFileDialog.Multiselect = true;
            this.openFileDialog.Title = "Select File";

            DialogResult dr = this.openFileDialog.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                foreach (string file in openFileDialog.FileNames)
                {
                    try
                    {
                        byte[] archivo = File.ReadAllBytes(file);

                        Plano plano = new Plano();

                        plano.Nombre = Path.GetFileNameWithoutExtension(file);
                        plano.Archivo = archivo;
                        plano.Extension = Path.GetExtension(file);
                        plano.CarpetaId = Carpeta.Id;

                        planos.Add(plano);
                    }
                    catch (Exception)
                    {

                        throw;
                    }
                }

                bWorker.RunWorkerAsync(planos);
            }
        }

        private void FillGvPlanos()
        {
            try
            {
                Planos = ConnectHelper.ws.RetrieveEntitiesWhere(new Plano(), "CarpetaId = " + Carpeta.Id).Cast<Plano>().ToList();

                var aux = from f in Planos
                        select new
                        {
                            CarpetaId = f.CarpetaId,
                            Nombre = f.Nombre,
                            Extension = f.Extension,
                            Id = f.Id
                        };

                gvPlanos.DataSource = null;
                gvPlanos.DataSource = aux.ToList();
                gvPlanos.Columns["CarpetaId"].Visible = false;
                gvPlanos.Columns["Id"].Visible = false;
                gvPlanos.Columns["Nombre"].Width = 413;
                gvPlanos.Columns["Extension"].Width = 100;
            }
            catch (Exception)
            {

                throw;
            }
        }

        private void btnDescargarSeleccionado_Click(object sender, EventArgs e)
        {
            if (gvPlanos.SelectedRows.Count == 1)
            {
                try
                {
                    Plano plano = Planos.FirstOrDefault(x => x.Id == (int)gvPlanos.SelectedRows[0].Cells["Id"].Value);

                    this.saveFileDialog.FileName = plano.Nombre;
                    this.saveFileDialog.DefaultExt = plano.Extension;
                    this.saveFileDialog.ShowDialog();
                    File.WriteAllBytes(saveFileDialog.FileName, plano.Archivo);

                    MessageBox.Show("El Plano ha sido descargado correctamente.",
                                "Descarga Contenido.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                }
                catch (Exception)
                {
                    MessageBox.Show("Ocurrió un problema al descargar el Plano, por favor intente nuevamente mas tarde.",
                            "Descarga Contenido.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                    throw;
                }
            }
        }

        private void btnDescargarTodo_Click(object sender, EventArgs e)
        {
            try
            {
                using (FolderBrowserDialog fbd = new FolderBrowserDialog())
                {
                    fbd.ShowNewFolderButton = true;
                    string folderPath = string.Empty;
                    if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        folderPath = fbd.SelectedPath;
                        foreach (Plano plano in Planos)
                        {
                            File.WriteAllBytes(folderPath + @"\" + plano.Nombre + plano.Extension, plano.Archivo);
                        }


                        MessageBox.Show("Los Planos se han descargado correctamente.",
                                    "Descarga de Planos.",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Information);
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Ocurrió un problema al descargar el archivo, por favor intente nuevamente mas tarde.",
                        "Descarga de Planos.",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);
                throw;
            }
        }

        private void bWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<Plano> planos = new List<Plano>();
                planos = e.Argument as List<Plano>;
                ConnectHelper.ws.Timeout = 600000;
                int i = 1;
                foreach (Plano plano in planos)
                {
                    FormsHelper.ChangeStatusLabel("Subiendo " + i + " de " + planos.Count + "planos.");
                    ConnectHelper.ws.NuevoPlano(plano);
                    i++;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void bWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            FormsHelper.ChangeStatusLabel("Listo.");

            MessageBox.Show("Los Planos han sido guardado exitosamente.",
                            "Nuevos Planos.",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);

            FillGvPlanos();
        }
    }
}
